/*
 *
 *  Copyright (C) 1997-2011, OFFIS e.V.
 *  All rights reserved.  See COPYRIGHT file for details.
 *
 *  This software and supporting documentation were developed by
 *
 *    OFFIS e.V.
 *    R&D Division Health
 *    Escherweg 2
 *    D-26121 Oldenburg, Germany
 *
 *
 *  Module:  dcmjp2
 *
 *  Author:  qinwl,2017.06.27
 *
 *  Purpose: codec parameter class for dcmjp2 codecs
 *
 */

#ifndef DJP2CPARAM_H
#define DJP2CPARAM_H

#include "dcmtk/config/osconfig.h"
#include "dcmtk/dcmdata/dccodec.h" /* for DcmCodecParameter */
#include "dcmtk/dcmjp2/djp2define.h"

/** codec parameter for J2K codecs
 */
class DCMTK_DCMJP2_EXPORT DcmJ2KCodecParameter: public DcmCodecParameter
{
public:

	/** constructor.
	*  @param pCreateSOPInstanceUID true if a new SOP instance UID should be assigned
	*    upon compression/decompression
	*  @param pFragmentSize maximum fragment size (in kbytes) for compression, 0 for unlimited.
	*  @param pCreateOffsetTable create offset table during image compression?
	*  @param pConvertToSC flag indicating whether image should be converted to
	*    Secondary Capture upon compression
	*  @param pReverseDecompressionByteOrder flag indicating whether the byte order should
	*    be reversed upon decompression. Needed to correctly decode some incorrectly encoded
	*    images with more than one byte per sample.
	*/
	DcmJ2KCodecParameter(
		OFBool pCreateSOPInstanceUID = OFFalse,
		Uint32 pFragmentSize = 0,
		OFBool pCreateOffsetTable = OFTrue,
		OFBool pConvertToSC = OFFalse,
		OFBool pReverseDecompressionByteOrder = OFFalse);

	/// copy constructor
	DcmJ2KCodecParameter(const DcmJ2KCodecParameter& arg);

	/// destructor
	virtual ~DcmJ2KCodecParameter();

	/** this methods creates a copy of type DcmCodecParameter *
	*  it must be overweritten in every subclass.
	*  @return copy of this object
	*/
	virtual DcmCodecParameter *clone() const;

	/** returns the class name as string.
	*  can be used as poor man's RTTI replacement.
	*/
	virtual const char *className() const;

	/** returns maximum fragment size (in kbytes) for compression, 0 for unlimited.
	*  @return maximum fragment size for compression
	*/
	Uint32 getFragmentSize() const
	{
		return fragmentSize;
	}

	/** returns offset table creation flag
	*  @return offset table creation flag
	*/
	OFBool getCreateOffsetTable() const
	{
		return createOffsetTable;
	}

	/** returns secondary capture conversion flag
	*  @return secondary capture conversion flag
	*/
	OFBool getConvertToSC() const
	{
		return convertToSC;
	}

	/** returns mode for SOP Instance UID creation
	*  @return mode for SOP Instance UID creation
	*/
	OFBool getUIDCreation() const
	{
		return createInstanceUID;
	}

	/** returns reverse decompression byte order mode
	*  @return reverse decompression byte order mode
	*/
	OFBool getReverseDecompressionByteOrder() const
	{
		return reverseDecompressionByteOrder;
	}


private:

	/// private undefined copy assignment operator
	DcmJ2KCodecParameter& operator=(const DcmJ2KCodecParameter&);

	/// maximum fragment size (in kbytes) for compression, 0 for unlimited.
	Uint32 fragmentSize;

	/// create offset table during image compression
	OFBool createOffsetTable;

	/// flag indicating whether image should be converted to Secondary Capture upon compression
	OFBool convertToSC;

	/// create new Instance UID during compression/decompression?
	OFBool createInstanceUID;

	/** enable reverse byte order of RLE segments during decompression, needed to
	*  decompress certain incorrectly encoded RLE images
	*/
	OFBool reverseDecompressionByteOrder;

};


#endif
